fix(mobile): make the Android glass surface fully opaque - #14576
Merged
Conversation
Android has no backdrop blur, so `GlassSurface` fell back to a 0.94 tint to keep a hint of translucency. Verifying on a Pixel 8 Pro showed that only works in light mode. Translucency reads as frost when something blurs what shows through; with no blur, whatever bleeds through keeps its edges and reads as legible ghost text sitting on the header. The 6% bleed is ~8% relative contrast on a light surface (RGB 248) but ~93% on a dark one (RGB 14) — 6% of near-white content over near-black nearly doubles the luminance. In dark mode track titles, artists, durations and play counts were plainly readable behind the header. No single alpha works for both themes, so Android now trades the hint of translucency for a clean surface, matching the `ProfileNavOverlay` fallback this was meant to follow in the first place. Content still slides under the header — it just isn't see-through. iOS is unchanged and keeps its real blur. Verified on the Android emulator in dark mode with real content behind the header; iOS untouched. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Follow-up to #14575, from the Android pass. This is a real defect in what we just merged.
The bug
Android has no backdrop blur, so
GlassSurfacefell back to a0.94tint to keep a hint of translucency. That only works in light mode.Translucency reads as frost when something blurs what shows through. With no blur, whatever bleeds through keeps its edges and reads as legible ghost text sitting on top of the header. And the same alpha lands completely differently depending on the surface:
6% of near-white content over a near-black surface nearly doubles the luminance. In dark mode, track titles, artists, durations and play counts were plainly readable behind the header.
The fix
Android is now fully opaque — which is what the
ProfileNavOverlayfallback this was meant to follow already does (backgroundColor: backgroundSurface, no opacity). I cited that precedent in #14575 and then didn't actually follow it; that was the bug.No single alpha suits both themes, so Android trades the hint of translucency for a clean surface. Content still slides under the header, it just isn't see-through. iOS is unchanged and keeps its real blur.
Verification
Built
assembleProdDebugand ran on a Pixel 8 Pro (API 35) emulator in dark mode with real content scrolled behind the header — the surface is now clean, and content clips at the glass edge instead of bleeding through.tsc0 errors,eslintclean.Also confirmed on Android during the same pass, unchanged by this fix: tab bar position/elevation and z-order against the play bar, now-playing drawer and left nav drawer; auto-hide of both bars; and content offset (at max scroll the last item lands exactly at the play bar top).
Known, not addressed here
The play bar doesn't participate in auto-hide, so hiding the chrome mid-playback leaves it floating with an empty band beneath it. Not Android-specific and pre-existing from #14575 — worth a separate change if we want the bottom chrome to move as one unit.
🤖 Generated with Claude Code